package com.test.ad.demo.util;

import android.content.Context;
import java.io.File;

import android.os.AsyncTask;
import android.widget.Toast;

import java.lang.ref.WeakReference;

public class AppDataCleaner {

    /**
     * 同时清理应用数据和缓存数据
     */
    public static void clearAllData(Context context) {
        new ClearAllDataTask(context).execute();
    }

    /**
     * 获取总数据大小（应用数据 + 缓存）
     */
    public static long getTotalDataSize(Context context) {
        return getAppDataSize(context) + getCacheSize(context);
    }

    /**
     * 获取应用数据大小
     */
    public static long getAppDataSize(Context context) {
        long dataSize = 0;
        try {
            // 数据目录
            File filesDir = context.getFilesDir();
            if (filesDir != null && filesDir.exists()) {
                dataSize += getDirSize(filesDir);
            }

            // 数据库目录
            File databasesDir = new File(context.getApplicationInfo().dataDir, "databases");
            if (databasesDir.exists()) {
                dataSize += getDirSize(databasesDir);
            }

            // SharedPreferences目录
            File sharedPrefsDir = new File(context.getApplicationInfo().dataDir, "shared_prefs");
            if (sharedPrefsDir.exists()) {
                dataSize += getDirSize(sharedPrefsDir);
            }

            // 自定义数据目录（如果有）
            // dataSize += getDirSize(new File(context.getApplicationInfo().dataDir, "your_custom_dir"));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return dataSize;
    }

    /**
     * 获取缓存大小
     */
    public static long getCacheSize(Context context) {
        long cacheSize = 0;
        try {
            // 内部缓存
            File cacheDir = context.getCacheDir();
            if (cacheDir != null && cacheDir.exists()) {
                cacheSize += getDirSize(cacheDir);
            }

            // 外部缓存
            File externalCacheDir = context.getExternalCacheDir();
            if (externalCacheDir != null && externalCacheDir.exists()) {
                cacheSize += getDirSize(externalCacheDir);
            }

            // WebView缓存
            File webViewCacheDir = new File(context.getCacheDir(), "webview");
            if (webViewCacheDir.exists()) {
                cacheSize += getDirSize(webViewCacheDir);
            }

            // 其他可能的缓存目录
            File codeCacheDir = new File(context.getCacheDir(), "code_cache");
            if (codeCacheDir.exists()) {
                cacheSize += getDirSize(codeCacheDir);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return cacheSize;
    }

    /**
     * 计算目录大小
     */
    private static long getDirSize(File dir) {
        long size = 0;
        if (dir != null && dir.exists()) {
            File[] files = dir.listFiles();
            if (files != null) {
                for (File file : files) {
                    if (file.isDirectory()) {
                        size += getDirSize(file);
                    } else {
                        size += file.length();
                    }
                }
            }
        }
        return size;
    }

    /**
     * 格式化文件大小
     */
    public static String formatFileSize(long size) {
        if (size <= 0) return "0B";

        final String[] units = new String[]{"B", "KB", "MB", "GB", "TB"};
        int digitGroups = (int) (Math.log10(size) / Math.log10(1024));

        return String.format("%.1f %s", size / Math.pow(1024, digitGroups), units[digitGroups]);
    }

    /**
     * 清理所有数据的异步任务
     */
    private static class ClearAllDataTask extends AsyncTask<Void, Void, Boolean> {
        private WeakReference<Context> contextRef;
        private long clearedSize;
        private long appDataSize;
        private long cacheSize;

        ClearAllDataTask(Context context) {
            this.contextRef = new WeakReference<>(context);
        }

        @Override
        protected void onPreExecute() {
            Context context = contextRef.get();
            if (context != null) {
                // 在清理前获取数据大小
                appDataSize = getAppDataSize(context);
                cacheSize = getCacheSize(context);
            }
        }

        @Override
        protected Boolean doInBackground(Void... voids) {
            Context context = contextRef.get();
            if (context == null) return false;

            try {
                // 1. 清理应用数据
                // 数据文件目录
                File filesDir = context.getFilesDir();
                if (filesDir != null && filesDir.exists()) {
                    clearedSize += deleteDirContents(filesDir);
                }

                // 数据库目录
                File databasesDir = new File(context.getApplicationInfo().dataDir, "databases");
                if (databasesDir.exists()) {
                    clearedSize += deleteDirContents(databasesDir);
                }

                // SharedPreferences目录
                File sharedPrefsDir = new File(context.getApplicationInfo().dataDir, "shared_prefs");
                if (sharedPrefsDir.exists()) {
                    clearedSize += deleteDirContents(sharedPrefsDir);
                }

                // 2. 清理缓存
                // 内部缓存
                File cacheDir = context.getCacheDir();
                if (cacheDir != null && cacheDir.exists()) {
                    clearedSize += deleteDirContents(cacheDir);
                }

                // 外部缓存
                File externalCacheDir = context.getExternalCacheDir();
                if (externalCacheDir != null && externalCacheDir.exists()) {
                    clearedSize += deleteDirContents(externalCacheDir);
                }

                // WebView缓存
                File webViewCacheDir = new File(context.getCacheDir(), "webview");
                if (webViewCacheDir.exists()) {
                    clearedSize += deleteDirContents(webViewCacheDir);
                }

                // 代码缓存
                File codeCacheDir = new File(context.getCacheDir(), "code_cache");
                if (codeCacheDir.exists()) {
                    clearedSize += deleteDirContents(codeCacheDir);
                }

                return true;
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
        }

        @Override
        protected void onPostExecute(Boolean success) {
            Context context = contextRef.get();
            if (context == null) return;

            if (success) {
                String message = String.format("已清理: %s应用数据 + %s缓存 = 总共%s",
                        formatFileSize(appDataSize),
                        formatFileSize(cacheSize),
                        formatFileSize(clearedSize));

                Toast.makeText(context, message, Toast.LENGTH_LONG).show();
                ActivityManager.getInstance().exitApp(context);
                // 可以在这里添加回调通知UI更新
                if (context instanceof CleanCompleteListener) {
                    ((CleanCompleteListener) context).onCleanComplete(clearedSize);
                }
            } else {
                Toast.makeText(context, "清理数据失败", Toast.LENGTH_SHORT).show();
            }
        }
    }

    /**
     * 删除目录中的所有内容但不删除目录本身
     */
    private static long deleteDirContents(File dir) {
        long deletedSize = 0;
        if (dir != null && dir.exists() && dir.isDirectory()) {
            File[] files = dir.listFiles();
            if (files != null) {
                for (File file : files) {
                    if (file.isDirectory()) {
                        deletedSize += deleteDir(file); // 对于子目录，直接删除整个目录
                    } else {
                        deletedSize += file.length();
                        file.delete();
                    }
                }
            }
        }
        return deletedSize;
    }

    /**
     * 递归删除目录（包括目录本身）
     */
    private static long deleteDir(File dir) {
        long deletedSize = 0;
        if (dir != null && dir.exists()) {
            if (dir.isDirectory()) {
                File[] children = dir.listFiles();
                if (children != null) {
                    for (File child : children) {
                        deletedSize += deleteDir(child);
                    }
                }
            }
            deletedSize += dir.length();
            dir.delete();
        }
        return deletedSize;
    }

    /**
     * 清理完成监听接口
     */
    public interface CleanCompleteListener {
        void onCleanComplete(long cleanedSize);
    }
}